package edu.isistan.matching.scoreTypes;

import edu.isistan.metamodel.ModelElement;

/**
 * Entidad que representa una matriz con resultados producidos por el algoritmo
 * de StructuralMatching
 * 
 * @author Matias
 * 
 */
public class ScoreMatrix {
	/**
	 * Ancho de la matriz
	 */
	private int xSize = 0;
	/**
	 * Alto de la matriz.
	 */
	private int ySize = 0;
	/**
	 * Array que representa la matriz de resultados
	 */
	private MatchScore[][] matrix = null;

	/**
	 * Esta matriz representa una lista de pares de WSDLElement, que forman la
	 * mejor combinacion (score mas alto) dentro de una matriz de comparacion
	 * del algoritmo de structural matching. Está formada a partir de la matriz
	 * <b>mappingValue</b>
	 */
	private ModelElement[][] mappingElements;

	/**
	 * Esta matriz representa una lista de pares de enteros, que representan las
	 * coordenadas de las celdas seleccionadas como solucion al problema de
	 * encontrar la mejor combinacion entre dos conjuntos de elementos. Los
	 * resultados de la comparativa se encuentran en la matriz referenciada por
	 * la propiedad <b>childMatrix</b>. Las dimensiones de la matriz son
	 * <b>(T,2)</b>, donde <b>T</b> es la cantidad de elementos pertenecientes
	 * a la solucion.
	 */
	private int[][] mappingValues;
		

	public ScoreMatrix(int x, int y) {
		super();
		xSize = x;
		ySize = y;
		matrix = new MatchScore[xSize][ySize];
	}

	public int getXSize() {
		return xSize;
	}

	public void setXSize(int size) {
		xSize = size;
	}

	public int getYSize() {
		return ySize;
	}

	public void setYSize(int size) {
		ySize = size;
	}

	public MatchScore[][] getMatrix() {
		return matrix;
	}

	public void setMatrix(MatchScore[][] matrix) {
		this.matrix = matrix;
	}

	/**
	 * El valor booleando indica si pudo insertar el elemento en el array.
	 *   
	 * @param i
	 * @param j
	 * @param score
	 * @return
	 */
	public boolean addValue(int i, int j, MatchScore score) {
		if (i < getXSize() && j < getYSize()) {
			matrix[i][j] = score;
			return true;
		}
		return false;
	}

	public ModelElement[][] getMappingElements() {
		return mappingElements;
	}

	public void setMappingElements(ModelElement[][] mappingElements) {
		this.mappingElements = mappingElements;
	}

	public int[][] getMappingValues() {
		return mappingValues;
	}

	public void setMappingValues(int[][] mappingValues) {
		this.mappingValues = mappingValues;
	}
	
	public  double[][] getDoubleValuesMatrix() {
		double[][] matrix = new double[getXSize()][getYSize()];
		for (int i = 0; i < getXSize(); i++) {
			for (int j = 0; j < getYSize(); j++) {
				MatchScore score = getMatrix()[i][j];
				if (score != null) {
					matrix[i][j] = score.getScore();
				} else {
					matrix[i][j] = 0;
				}
			}
		}
		return matrix;
	}
	
	public MatchScore[] getBestMatchScore(){
		if (mappingValues != null && mappingValues.length != 0){
			MatchScore[] result = new MatchScore[mappingValues.length];
			for (int i = 0; i < mappingValues.length; i++) {
				int x = mappingValues[i][0];
				int y = mappingValues[i][1];
				result[i] = matrix[x][y];
			}
			return result;	
		}
		return null;
	}
}
